package imoocvideodev.common.util.videoUtil;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author: Redi
 * @Date: 2021/2/8 16:41
 * @Description: 合并音视频类
 */
public class MergeVideoBgm {

    //ffmpeg 地址
    private static final String ffmpegEXE =  "D:/Linux/ffmpeg/ffmpeg/bin/ffmpeg.exe";

    /**
     * 有声视频+音频合并为一个视频。
     * 若音频比视频长，画面停留在最后一帧，继续播放声音,
     * 若要以视频和音频两者时长短的为主，放开注解启用-shortest。
     *
     * @param videoResourcesPath 视频文件的路径
     * @param audioResourcesPath 音频文件的路径
     */
    public static void mergeVideoAudio(String videoResourcesPath, String audioResourcesPath
            ,Float videoSeconds,String videoOutputPath) {
        List<String> command = new ArrayList<>();
        command.add(ffmpegEXE);
        command.add("-i");
        command.add(videoResourcesPath);
        command.add("-i");
        command.add(audioResourcesPath);
        command.add("-filter_complex");
        command.add("amix");
        command.add("-map");
        command.add("0:v");
        command.add("-map");
        command.add("0:a");
        command.add("-map");
        command.add("1:a");
        //-shortest会取视频或音频两者短的一个为准，多余部分则去除不合并
//        command.add("-shortest");
        command.add("-t");
        command.add(String.valueOf(videoSeconds));
        command.add(videoOutputPath);
        commandStart(command);

        //删除未更改的源文件
        File inputFile = new File(videoResourcesPath);
        inputFile.delete();
    }

    public static void commandStart(List<String> command) {
        command.forEach(v -> System.out.print(v + " "));
        System.out.println();
        System.out.println();
        ProcessBuilder builder = new ProcessBuilder();
        //正常信息和错误信息合并输出
        builder.redirectErrorStream(true);
        builder.command(command);
        //开始执行命令
        Process process = null;
        try {
            process = builder.start();
            //如果你想获取到执行完后的信息，那么下面的代码也是需要的
            String line = "";
            BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
            while ((line = br.readLine()) != null) {
//                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
